package com.lhq.Stream_API;

import org.junit.Test;
import org.omg.CORBA.INTERNAL;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.stream.IntStream;
import java.util.stream.Stream;

/**
 * Stream 是 Java8 中处理集合的关键抽象概念，它可以指定你希望对
 * 集合进行的操作，可以执行非常复杂的查找、过滤和映射数据等操作。
 * 使用Stream API 对集合数据进行操作，就类似于使用 SQL 执行的数
 * 据库查询。也可以使用 Stream API 来并行执行操作。简而言之，
 * Stream API 提供了一种高效且易于使用的处理数据的方式。
 * ①Stream 自己不会存储元素。
 * ②Stream 不会改变源对象。相反，他们会返回一个持有结果的新Stream。
 * ③Stream 操作是延迟执行的。这意味着他们会等到需要结果的时候才执行。
 *
 * 一创建 Stream
 * Java8 中的 Collection 接口被扩展，提供了
 * 两个获取流的方法：  default Stream<E> stream() : 返回一个顺序流
 *  default Stream<E> parallelStream() : 返回一个并行流
 * 1.数组创建流（Arrays 的静态方法 stream()）
 * 2.由值创建流
 * 可以使用静态方法 Stream.of(), 通过显示值创建一个流
 * 3.创建无限流
 * 可以使用静态方法 Stream.iterate() 和
 * Stream.generate(), 创建无限流。
 *  迭代
 * public static<T> Stream<T> iterate(final T seed, final
 * UnaryOperator<T> f)
 *  生成
 * public static<T> Stream<T> generate(Supplier<T> s) :
 * 二Stream 的中间操作
 * 多个中间操作可以连接起来形成一个流水线，除非流水
 * 线上触发终止操作，否则中间操作不会执行任何的处理！
 * 而在终止操作时一次性全部处理，称为“惰性求值”
 * 三Stream 的终止操作
 *
 */
public class StreamTest {

    @Test
    public void test2(){
        //2. 通过 Arrays 中的 stream() 获取一个数组流
        int[] ars=new int[]{10,20,20,30,20,100,200,3234,200};
        IntStream stream = Arrays.stream(ars).filter(e->{
            System.out.println("中间操作");
            return e>20;
        }).distinct();
        //只有当做终止操作时，所有的中间操作会一次性的全部执行，称为“惰性求值”
        stream.forEach(System.out::println);
    }
    @Test
    public void test1(){
        //1. Collection 提供了两个方法  stream() 与 parallelStream()
        ArrayList<Object> list = new ArrayList<>();
        Stream<Object> stream1 = list.stream();
        Stream<Object> stream2 = list.parallelStream();
        //2. 通过 Arrays 中的 stream() 获取一个数组流
        int[] ars=new int[]{10,20,20,30,20,100,200,3234};
        IntStream stream = Arrays.stream(ars);

        System.out.println(stream);
        //3. 通过 Stream 类中静态方法 of()
        Stream<Integer> stream3 = Stream.of(1, 2, 3);

        //4. 创建无限流
        //迭代
        Stream<Integer> stream5 = Stream.iterate(0, (x) -> x + 2).limit(10);
        stream3.forEach(System.out::println);

        //生成
        Stream<Double> stream4 = Stream.generate(Math::random).limit(2);
        stream4.forEach(System.out::println);
    }
}
